Skip to content

fix(lambda): use scope graph env for edit capture checks#420

Merged
dowdiness merged 3 commits into
mainfrom
feat/lambda-enclosing-env
May 31, 2026
Merged

fix(lambda): use scope graph env for edit capture checks#420
dowdiness merged 3 commits into
mainfrom
feat/lambda-enclosing-env

Conversation

@dowdiness
Copy link
Copy Markdown
Owner

@dowdiness dowdiness commented May 31, 2026

Summary

  • Migrates lambda edit capture checks from the old collect_lam_env helper to canonical @scope.enclosing_env.
  • Removes the public collect_lam_env edits API and updates enclosing_env docs now that it has edit consumers.
  • Adds behavior tests for module-definition capture: allow same-declaration module refs, reject later module shadowing, preserve lambda-capture rejection, and cover extract/inline separately.

Reuse check

Existing APIs considered:

API Location Reused? Reason if not
@scope.enclosing_env lang/lambda/scope/query.mbt Yes Canonical lexical environment query; target API for this migration.
@scope.declaration lang/lambda/scope/query.mbt Yes Used to compare original reference declarations against hypothetical edit-site declarations.
free_vars lang/lambda/edits/free_vars.mbt Yes Existing free-name analysis for edit capture checks.
collect_var_usages lang/lambda/edits/scope.mbt Yes Existing shadow-aware Var traversal reused for extract and inline checks.

New helpers added:

  • name_captured_at_node: private edits-package predicate for one name against @scope.enclosing_env at a node.
  • free_names_captured_at_use_sites: private edits-package predicate for bare-expression extraction, where composite nodes need per-use-site environments.
  • def_cutoff_at_node, scope_id_for_node, root_scope_id, declaration_id_for_name_from_scope, declaration_id_for_name_at_node, declaration_id_for_name_at_module_end: private edits-package helpers for resolving a name at concrete or hypothetical edit sites using the same module cutoff rule.
  • free_names_would_rebind_at_node, free_names_would_rebind_at_module_end, free_name_would_rebind_to: private edits-package predicates that reject only when a free occurrence would resolve to a different declaration after the edit.

Test plan

  • NEW_MOON_MOD=0 moon check passes
  • NEW_MOON_MOD=0 moon test passes
  • git diff *.mbti reviewed for unintended API surface changes
  • JS rebuild not run; web build artifacts are not affected by this MoonBit edit-semantics change

Validation

NEW_MOON_MOD=0 moon check
NEW_MOON_MOD=0 moon test lang/lambda/edits
NEW_MOON_MOD=0 moon fmt && NEW_MOON_MOD=0 moon info
NEW_MOON_MOD=0 moon check --deny-warn
git diff --check
NEW_MOON_MOD=0 moon test

Results:

  • lang/lambda/edits: 135/135 passed
  • workspace: 1275/1275 passed
  • .mbti: only intended removal is public collect_lam_env

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 31, 2026

Warning

Review limit reached

@dowdiness, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 46 minutes and 38 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5833a7e6-1ae2-4ee0-8878-a1dd1ce19da7

📥 Commits

Reviewing files that changed from the base of the PR and between 793a7f6 and ad9a487.

📒 Files selected for processing (6)
  • lang/lambda/edits/pkg.generated.mbti
  • lang/lambda/edits/scope.mbt
  • lang/lambda/edits/text_edit_refactor.mbt
  • lang/lambda/edits/text_edit_rename.mbt
  • lang/lambda/edits/text_edit_wbtest.mbt
  • lang/lambda/scope/query.mbt
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/lambda-enclosing-env

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented May 31, 2026

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
lambda-editor ad9a487 Commit Preview URL

Branch Preview URL
May 31 2026, 10:18 AM

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2061f945f6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread lang/lambda/edits/scope.mbt Outdated
) -> Bool {
let env = @scope.enclosing_env(g, node_id)
let mut captured = false
free_names.each(fn(v) { if env.contains(v) { captured = true } })
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid treating same module binding as capture

When the initializer already refers to an earlier module binding, e.g. let y = 1\nlet x = y\nx, free_vars(def.1.kind, empty) contains y and enclosing_env at the body also contains that same y, so this name-only membership check reports capture and blocks both single/all inlining. That replacement is not a capture—the inserted y resolves to the same declaration as the initializer did—so the guard needs to compare resolved declarations or exclude names already bound in the initializer’s own environment instead of rejecting any matching enclosing module name.

Useful? React with 👍 / 👎.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 31, 2026

Benchmark Comparison Report

Comparing PR branch against main

Main Module Benchmarks

Base branch:

[dowdiness/btree] bench btree_benchmark.mbt:79 ("bench: build via inserts (100)") ok
time (mean ± σ)         range (min … max) 
  65.28 µs ± 671.05 ns    64.63 µs …  67.02 µs  in 10 ×   1475 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   3.05 µs ±   9.88 ns     3.05 µs …   3.08 µs  in 10 ×  35773 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
   1.06 ms ±  26.33 µs     1.04 ms …   1.12 ms  in 10 ×     94 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  30.00 µs ±  89.75 ns    29.87 µs …  30.19 µs  in 10 ×   3329 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  16.06 ms ± 130.78 µs    15.86 ms …  16.25 ms  in 10 ×      7 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 520.98 µs ±  10.08 µs   506.37 µs … 533.36 µs  in 10 ×    196 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  58.22 µs ± 672.86 ns    57.52 µs …  59.86 µs  in 10 ×   1674 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  52.74 µs ± 261.93 ns    52.38 µs …  53.08 µs  in 10 ×   1881 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 706.68 µs ±   4.72 µs   701.24 µs … 713.33 µs  in 10 ×    144 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 691.50 µs ±   8.46 µs   683.75 µs … 703.62 µs  in 10 ×    144 runs
Total tests: 10, passed: 10, failed: 0. [wasm-gc]
node count: 402
node count: 802
node count: 2002
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:24 ("viewnode serialization (100 defs)") ok
time (mean ± σ)         range (min … max) 
   1.88 ms ±  22.91 µs     1.85 ms …   1.92 ms  in 10 ×     53 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:35 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   4.66 ms ± 106.49 µs     4.53 ms …   4.90 ms  in 10 ×     21 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:46 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  21.06 ms ±   1.35 ms    19.29 ms …  23.16 ms  in 10 ×      6 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:57 ("compute_view_patches (100 defs, single edit)") ok
time (mean ± σ)         range (min … max) 
   1.80 ms ±  43.42 µs     1.75 ms …   1.91 ms  in 10 ×     56 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.01 ms ±  67.70 µs   936.99 µs …   1.14 ms  in 10 ×     99 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.90 ms ±  58.62 µs     3.84 ms …   4.00 ms  in 10 ×     26 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:108 ("json object - incremental keystroke (500 members)") ok
time (mean ± σ)         range (min … max) 
  25.56 ms ± 411.34 µs    25.09 ms …  26.16 ms  in 10 ×      4 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:113 ("json object - incremental keystroke (1000 members)") ok
time (mean ± σ)         range (min … max) 
  59.07 ms ± 364.42 µs    58.51 ms …  59.56 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:118 ("json array - incremental keystroke (20 elements)") ok
time (mean ± σ)         range (min … max) 
 784.64 µs ± 164.47 µs   540.86 µs …   1.01 ms  in 10 ×    217 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
   1.85 ms ±  54.81 µs     1.75 ms …   1.90 ms  in 10 ×     57 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  12.46 ms ± 273.75 µs    12.19 ms …  12.99 ms  in 10 ×      9 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:133 ("json array - incremental keystroke (1000 elements)") ok
time (mean ± σ)         range (min … max) 
  30.52 ms ± 454.02 µs    29.94 ms …  31.04 ms  in 10 ×      3 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:38 ("tree refresh unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
   4.04 µs ±  87.00 ns     3.99 µs …   4.20 µs  in 10 ×  24130 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  15.98 µs ± 262.04 ns    15.83 µs …  16.59 µs  in 10 ×   6217 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
  71.44 µs ±   1.32 µs    70.58 µs …  75.01 µs  in 10 ×   1396 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 273.71 µs ±   2.77 µs   269.00 µs … 277.45 µs  in 10 ×    369 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
   6.75 µs ±  44.29 ns     6.71 µs …   6.83 µs  in 10 ×  14973 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 117.51 µs ± 761.26 ns   116.28 µs … 118.31 µs  in 10 ×    851 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 450.57 µs ±   2.55 µs   448.16 µs … 455.23 µs  in 10 ×    227 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  25.41 µs ± 923.86 ns    25.01 µs …  28.03 µs  in 10 ×   3984 runs
Total tests: 20, passed: 20, failed: 0. [js]

PR branch:

Registry index cloned successfully
Symbols updated successfully
Downloading moonbitlang/async@0.16.8
Downloading moonbitlang/quickcheck@0.11.2
Downloading moonbitlang/x@0.4.38
Downloading moonbit-community/rabbita@0.12.3
Downloading dowdiness/rle@0.2.0
[dowdiness/btree] bench btree_benchmark.mbt:79 ("bench: build via inserts (100)") ok
time (mean ± σ)         range (min … max) 
  65.54 µs ± 742.20 ns    64.83 µs …  67.47 µs  in 10 ×   1492 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   3.06 µs ±  50.90 ns     3.04 µs …   3.20 µs  in 10 ×  36064 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
   1.05 ms ±   8.96 µs     1.03 ms …   1.06 ms  in 10 ×     88 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  29.05 µs ± 181.16 ns    28.75 µs …  29.27 µs  in 10 ×   3419 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  15.77 ms ± 209.06 µs    15.55 ms …  16.12 ms  in 10 ×      7 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 531.60 µs ±  22.28 µs   507.08 µs … 568.91 µs  in 10 ×    197 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  58.37 µs ± 424.86 ns    58.00 µs …  59.24 µs  in 10 ×   1640 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  53.05 µs ± 318.42 ns    52.46 µs …  53.34 µs  in 10 ×   1896 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 715.43 µs ±   3.90 µs   708.77 µs … 722.01 µs  in 10 ×    142 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 704.53 µs ±  11.01 µs   690.37 µs … 720.02 µs  in 10 ×    142 runs
Total tests: 10, passed: 10, failed: 0. [wasm-gc]
node count: 402
node count: 802
node count: 2002
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:24 ("viewnode serialization (100 defs)") ok
time (mean ± σ)         range (min … max) 
   1.86 ms ±  27.13 µs     1.84 ms …   1.91 ms  in 10 ×     55 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:35 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   4.58 ms ±  60.11 µs     4.50 ms …   4.68 ms  in 10 ×     22 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:46 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  21.37 ms ±   1.59 ms    19.57 ms …  24.31 ms  in 10 ×      6 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:57 ("compute_view_patches (100 defs, single edit)") ok
time (mean ± σ)         range (min … max) 
   2.02 ms ± 126.83 µs     1.88 ms …   2.22 ms  in 10 ×     51 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.05 ms ±  73.43 µs   967.92 µs …   1.17 ms  in 10 ×     93 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.20 ms ± 240.52 µs     4.01 ms …   4.62 ms  in 10 ×     25 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:108 ("json object - incremental keystroke (500 members)") ok
time (mean ± σ)         range (min … max) 
  26.59 ms ± 403.58 µs    26.15 ms …  27.22 ms  in 10 ×      4 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:113 ("json object - incremental keystroke (1000 members)") ok
time (mean ± σ)         range (min … max) 
  61.51 ms ±   2.02 ms    60.17 ms …  66.90 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:118 ("json array - incremental keystroke (20 elements)") ok
time (mean ± σ)         range (min … max) 
 769.60 µs ± 155.40 µs   545.53 µs … 977.39 µs  in 10 ×    210 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
   1.87 ms ±  45.21 µs     1.80 ms …   1.94 ms  in 10 ×     56 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  12.52 ms ± 135.40 µs    12.33 ms …  12.75 ms  in 10 ×      8 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:133 ("json array - incremental keystroke (1000 elements)") ok
time (mean ± σ)         range (min … max) 
  32.14 ms ± 193.46 µs    31.87 ms …  32.48 ms  in 10 ×      4 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:38 ("tree refresh unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
   4.03 µs ±  56.69 ns     3.99 µs …   4.14 µs  in 10 ×  24364 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  14.97 µs ± 171.00 ns    14.79 µs …  15.39 µs  in 10 ×   6617 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
  65.17 µs ±   1.11 µs    64.42 µs …  67.49 µs  in 10 ×   1549 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 249.90 µs ±   1.32 µs   247.95 µs … 252.12 µs  in 10 ×    397 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
   7.07 µs ±  34.97 ns     7.05 µs …   7.17 µs  in 10 ×  14171 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 115.58 µs ± 696.45 ns   114.67 µs … 116.52 µs  in 10 ×    862 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 438.58 µs ±   5.35 µs   429.28 µs … 446.61 µs  in 10 ×    230 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  25.73 µs ± 103.92 ns    25.57 µs …  25.88 µs  in 10 ×   3892 runs
Total tests: 20, passed: 20, failed: 0. [js]

event-graph-walker Benchmarks

Base branch:

Registry index updated successfully
Symbols updated successfully
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:21 ("merge - concurrent edits (2 agents x 10)") ok
time (mean ± σ)         range (min … max) 
  21.37 µs ± 731.76 ns    20.62 µs …  22.96 µs  in 10 ×   4566 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:59 ("merge - concurrent edits (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
 112.62 µs ±   1.03 µs   111.68 µs … 114.86 µs  in 10 ×    900 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:97 ("merge - concurrent edits (2 agents x 200)") ok
time (mean ± σ)         range (min … max) 
 510.99 µs ±   2.68 µs   506.89 µs … 515.15 µs  in 10 ×    197 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:135 ("merge - many agents (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
 141.37 µs ± 656.13 ns   140.51 µs … 142.41 µs  in 10 ×    712 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:184 ("merge - with deletes (50 inserts, 25 deletes)") ok
time (mean ± σ)         range (min … max) 
 106.01 µs ± 723.89 ns   105.16 µs … 107.25 µs  in 10 ×    925 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:230 ("merge - graph_diff advance (20 ops)") ok
time (mean ± σ)         range (min … max) 
  69.49 µs ± 479.66 ns    68.79 µs …  69.97 µs  in 10 ×   1413 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:303 ("merge - repeated small (10 iterations x 5 ops)") ok
time (mean ± σ)         range (min … max) 
 109.12 µs ± 610.12 ns   108.41 µs … 110.01 µs  in 10 ×    910 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:341 ("merge - retreat concurrent deletes (500 items, 50 deletes)") ok
time (mean ± σ)         range (min … max) 
 208.11 µs ± 922.72 ns   207.00 µs … 209.83 µs  in 10 ×    478 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:408 ("merge - context apply operations (50 ops)") ok
time (mean ± σ)         range (min … max) 
  46.75 µs ±  29.02 µs    25.98 µs … 105.31 µs  in 10 ×   2627 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   3.88 µs ±  23.32 ns     3.86 µs …   3.92 µs  in 10 ×  25541 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  27.94 µs ±  89.13 ns    27.79 µs …  28.04 µs  in 10 ×   3554 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 402.90 µs ±   1.29 µs   400.94 µs … 405.15 µs  in 10 ×    248 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  11.50 µs ±   3.73 µs     9.38 µs …  21.80 µs  in 10 ×   9339 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  91.61 µs ±  52.96 µs    59.01 µs … 213.66 µs  in 10 ×   1597 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  37.82 µs ± 281.92 ns    37.34 µs …  38.21 µs  in 10 ×   2629 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  38.62 µs ± 368.05 ns    38.07 µs …  39.09 µs  in 10 ×   2555 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:176 ("branch - repeated advance steady-state (10 iterations)") ok
time (mean ± σ)         range (min … max) 
  26.67 µs ± 600.25 ns    26.16 µs …  27.95 µs  in 10 ×   3696 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:220 ("branch - repeated advance with oplog mutations (10 iterations)") ok
time (mean ± σ)         range (min … max) 
   7.58 ms ±   3.81 ms     2.83 ms …  13.90 ms  in 10 ×     66 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  11.86 µs ± 134.64 ns    11.66 µs …  12.12 µs  in 10 ×   7947 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 122.49 µs ± 441.96 ns   121.84 µs … 123.08 µs  in 10 ×    822 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:285 ("branch - single advance (1 new op)") ok
time (mean ± σ)         range (min … max) 
   4.06 µs ± 251.55 ns     3.83 µs …   4.64 µs  in 10 ×  25027 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  50.88 µs ±  28.87 µs    30.80 µs … 108.48 µs  in 10 ×   2175 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  16.41 ms ±   7.66 ms     6.70 ms …  31.00 ms  in 10 ×     28 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  19.73 µs ±  10.45 µs    12.80 µs …  42.42 µs  in 10 ×   6982 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 610.69 ns ±   7.60 ns   601.00 ns … 620.56 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:22 ("walker - linear history (100 ops)") ok
time (mean ± σ)         range (min … max) 
   4.78 µs ±   4.63 ns     4.78 µs …   4.79 µs  in 10 ×  20877 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  45.22 µs ± 685.85 ns    44.73 µs …  46.85 µs  in 10 ×   2229 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:54 ("walker - concurrent branches (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
   6.09 µs ±  10.61 ns     6.08 µs …   6.11 µs  in 10 ×  16339 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:79 ("walker - concurrent branches (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
   6.01 µs ±   9.61 ns     6.00 µs …   6.03 µs  in 10 ×  16625 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:99 ("walker - diamond pattern (50 diamonds)") ok
time (mean ± σ)         range (min … max) 
   8.23 µs ±  21.57 ns     8.20 µs …   8.26 µs  in 10 ×  12205 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:121 ("walker - diff advance only (10 new ops)") ok
time (mean ± σ)         range (min … max) 
   3.47 µs ±  29.36 ns     3.43 µs …   3.50 µs  in 10 ×  28768 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:145 ("walker - diff with concurrent branches") ok
time (mean ± σ)         range (min … max) 
   5.49 µs ±   8.62 ns     5.48 µs …   5.50 µs  in 10 ×  18191 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 460.32 µs ±   1.47 µs   458.80 µs … 462.92 µs  in 10 ×    219 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   8.01 ms ± 117.27 µs     7.85 ms …   8.24 ms  in 10 ×     13 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:213 ("walker - concurrent branches (100000 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
  25.69 ms ±   4.05 ms    22.98 ms …  33.48 ms  in 10 ×      4 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:6 ("version_vector - create (1 agent)") ok
time (mean ± σ)         range (min … max) 
  58.45 ns ±   0.76 ns    57.56 ns …  60.41 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:15 ("version_vector - create (5 agents)") ok
time (mean ± σ)         range (min … max) 
 282.52 ns ±   0.43 ns   281.92 ns … 283.09 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:29 ("version_vector - create (20 agents)") ok
time (mean ± σ)         range (min … max) 
   1.34 µs ±   2.55 ns     1.34 µs …   1.34 µs  in 10 ×  74544 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:42 ("version_vector - compare equal (5 agents)") ok
time (mean ± σ)         range (min … max) 
 330.63 ns ±   0.61 ns   329.43 ns … 331.24 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:63 ("version_vector - compare <= (5 agents)") ok
time (mean ± σ)         range (min … max) 
 165.79 ns ±   0.63 ns   165.10 ns … 166.95 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:84 ("version_vector - compare <= (20 agents)") ok
time (mean ± σ)         range (min … max) 
 682.55 ns ±   0.93 ns   681.50 ns … 684.61 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:100 ("version_vector - merge (5 agents)") ok
time (mean ± σ)         range (min … max) 
 466.78 ns ±   1.02 ns   465.54 ns … 467.94 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:118 ("version_vector - merge (20 agents)") ok
time (mean ± σ)         range (min … max) 
   2.62 µs ±   7.33 ns     2.61 µs …   2.63 µs  in 10 ×  38077 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:134 ("version_vector - includes (5 agents)") ok
time (mean ± σ)         range (min … max) 
 233.33 ns ±   3.47 ns   228.04 ns … 238.17 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:153 ("version_vector - concurrent (5 agents)") ok
time (mean ± σ)         range (min … max) 
 170.64 ns ±   0.59 ns   169.94 ns … 171.46 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:170 ("version_vector - from_frontier (10 ops)") ok
time (mean ± σ)         range (min … max) 
 556.48 ns ±   0.85 ns   555.26 ns … 557.95 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:186 ("version_vector - from_frontier (100 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.58 µs ±   9.66 ns     4.57 µs …   4.60 µs  in 10 ×  21881 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:206 ("version_vector - to_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
 283.16 ns ±   1.67 ns   281.67 ns … 287.43 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:230 ("version_vector - roundtrip (5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.87 µs ±   7.48 ns     4.86 µs …   4.88 µs  in 10 ×  20498 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:251 ("version_vector - agents (5 agents)") ok
time (mean ± σ)         range (min … max) 
  76.24 ns ±   0.64 ns    75.26 ns …  77.00 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:266 ("version_vector - length (20 agents)") ok
time (mean ± σ)         range (min … max) 
  13.21 ns ±   0.49 ns    12.77 ns …  14.13 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:20 ("bench: cache invalidate + position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 188.31 µs ± 804.99 ns   187.24 µs … 189.97 µs  in 10 ×    486 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:31 ("bench: cache invalidate + position query (5000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.77 ms ±  54.09 µs     2.69 ms …   2.85 ms  in 10 ×     36 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   8.99 ms ± 394.72 µs     8.60 ms …   9.71 ms  in 10 ×     11 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:57 ("bench: 10 remote inserts + queries (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
   3.68 ms ±  56.75 µs     3.60 ms …   3.77 ms  in 10 ×     26 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:84 ("bench: 10 remote inserts + queries (5000-char doc)") ok
time (mean ± σ)         range (min … max) 
  31.90 ms ± 638.42 µs    31.13 ms …  33.13 ms  in 10 ×      4 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:113 ("bench: warm cache position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 100.85 ns ±   0.69 ns   100.12 ns … 102.07 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:120 ("bench: warm cache position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
 101.37 ns ±   0.40 ns   100.77 ns … 102.19 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/fugue/tree_position_benchmark.mbt:20 ("bench: lv_to_position middle of 10K tree") ok
time (mean ± σ)         range (min … max) 
 554.34 µs ±   1.81 µs   551.92 µs … 556.85 µs  in 10 ×    181 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 162.89 µs ±   1.33 µs   161.46 µs … 164.59 µs  in 10 ×    609 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:26 ("jump - concurrent insert into 1K doc") ok
time (mean ± σ)         range (min … max) 
 157.56 µs ± 820.79 ns   156.62 µs … 159.12 µs  in 10 ×    636 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:58 ("jump - concurrent insert into 10K doc") ok
time (mean ± σ)         range (min … max) 
   4.47 ms ± 120.07 µs     4.32 ms …   4.65 ms  in 10 ×     23 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 158.20 µs ± 562.89 ns   157.35 µs … 158.92 µs  in 10 ×    634 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  42.23 µs ±   1.01 µs    41.48 µs …  44.97 µs  in 10 ×   2352 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 531.77 µs ±   5.06 µs   523.73 µs … 539.14 µs  in 10 ×    190 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:34 ("oplog - insert and delete mix (100 ops)") ok
time (mean ± σ)         range (min … max) 
  62.63 µs ± 227.15 ns    62.25 µs …  62.90 µs  in 10 ×   1600 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  30.94 µs ±  74.39 ns    30.86 µs …  31.08 µs  in 10 ×   3241 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 129.33 ns ±   0.58 ns   128.47 ns … 130.15 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:97 ("oplog - get_frontier (single agent)") ok
time (mean ± σ)         range (min … max) 
  23.59 ns ±   0.42 ns    22.99 ns …  24.32 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:112 ("oplog - get_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
  26.06 ns ±   0.31 ns    25.55 ns …  26.44 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:134 ("oplog - walk_and_collect (100 ops)") ok
time (mean ± σ)         range (min … max) 
   8.48 µs ±  54.95 ns     8.40 µs …   8.57 µs  in 10 ×  11426 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  17.18 µs ±  93.97 ns    17.04 µs …  17.30 µs  in 10 ×   5773 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:177 ("oplog - diff_and_collect (advance 20)") ok
time (mean ± σ)         range (min … max) 
   5.03 µs ±  14.05 ns     5.01 µs …   5.06 µs  in 10 ×  19267 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   7.44 µs ±  21.22 ns     7.42 µs …   7.48 µs  in 10 ×  14156 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 241.07 µs ± 727.47 ns   240.14 µs … 242.02 µs  in 10 ×    416 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  41.90 µs ± 164.91 ns    41.65 µs …  42.13 µs  in 10 ×   2387 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 164.81 ms ±  29.41 ms   125.92 ms … 199.60 ms  in 10 ×      1 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:287 ("oplog - diff_and_collect (100000 ops advance)") ok
time (mean ± σ)         range (min … max) 
  64.63 ms ±  19.33 ms    40.96 ms …  86.07 ms  in 10 ×      2 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:10 ("text - insert append (100 chars)") ok
time (mean ± σ)         range (min … max) 
 104.59 µs ±   2.47 µs   103.25 µs … 111.48 µs  in 10 ×    842 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.40 ms ±  16.04 µs     1.38 ms …   1.42 ms  in 10 ×     71 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 179.88 µs ± 399.04 ns   179.29 µs … 180.37 µs  in 10 ×    555 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:51 ("text - delete (100 deletes from 100-char doc)") ok
time (mean ± σ)         range (min … max) 
 256.26 µs ±   1.05 µs   254.98 µs … 258.58 µs  in 10 ×    391 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  14.77 µs ±  81.24 ns    14.67 µs …  14.91 µs  in 10 ×   6772 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 151.68 µs ± 421.31 ns   151.04 µs … 152.22 µs  in 10 ×    664 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  12.92 ns ±   0.47 ns    12.40 ns …  13.62 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:113 ("text - sync export_all (100 ops)") ok
time (mean ± σ)         range (min … max) 
 104.89 ns ±   0.54 ns   104.32 ns … 105.85 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:126 ("text - sync export_all (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 106.38 ns ±   0.51 ns   105.68 ns … 106.96 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:139 ("text - sync export_since (50-op delta, 1000-op base)") ok
time (mean ± σ)         range (min … max) 
  36.21 µs ± 388.26 ns    35.81 µs …  36.84 µs  in 10 ×   2734 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  52.08 µs ± 547.74 ns    51.18 µs …  52.77 µs  in 10 ×   1888 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 659.33 µs ±   3.41 µs   656.22 µs … 667.30 µs  in 10 ×    151 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:186 ("text - bidirectional sync (2 peers, 50 ops each)") ok
time (mean ± σ)         range (min … max) 
 109.36 µs ± 370.62 ns   108.88 µs … 109.85 µs  in 10 ×    911 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  13.14 µs ±  71.58 ns    13.05 µs …  13.23 µs  in 10 ×   7498 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 152.57 µs ± 309.13 ns   152.19 µs … 153.17 µs  in 10 ×    654 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:256 ("text - undo record_insert (100 ops, 1 group)") ok
time (mean ± σ)         range (min … max) 
   2.03 µs ±  90.12 ns     1.99 µs …   2.29 µs  in 10 ×  49526 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:269 ("text - undo record_insert (100 ops, 100 groups)") ok
time (mean ± σ)         range (min … max) 
   2.39 µs ±   4.13 ns     2.39 µs …   2.40 µs  in 10 ×  41867 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  31.01 µs ±  91.95 ns    30.88 µs …  31.17 µs  in 10 ×   3232 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 498.14 µs ±   5.08 µs   493.84 µs … 509.26 µs  in 10 ×    203 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:309 ("text - undo undo+redo roundtrip (10-op group)") ok
time (mean ± σ)         range (min … max) 
  34.94 µs ± 698.56 ns    34.49 µs …  36.86 µs  in 10 ×   2707 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:324 ("text - undo 10 undo+redo cycles (10-op group)") ok
time (mean ± σ)         range (min … max) 
 295.55 µs ±   1.37 µs   293.89 µs … 298.46 µs  in 10 ×    340 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.39 ms ±  11.89 µs     1.38 ms …   1.41 ms  in 10 ×     72 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.63 ms ±  50.65 µs     3.56 ms …   3.71 ms  in 10 ×     28 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.29 ms ±  25.14 µs     2.26 ms …   2.33 ms  in 10 ×     44 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:71 ("cache - jump to middle every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.03 ms ±  39.27 µs     2.98 ms …   3.08 ms  in 10 ×     34 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:94 ("cache - single non-seq insert on 1000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.96 µs ±   1.30 µs     6.86 µs …  11.05 µs  in 10 ×  16269 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:108 ("cache - single non-seq insert on 5000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.61 µs ±   1.36 µs     6.61 µs …  10.46 µs  in 10 ×  13259 runs
Total tests: 105, passed: 105, failed: 0.

PR branch:

Registry index updated successfully
Symbols updated successfully
Downloading dowdiness/btree@0.1.0
Using cached dowdiness/rle@0.2.0
Downloading dowdiness/order-tree@0.1.0
Downloading dowdiness/alga@0.3.0
Using cached moonbitlang/quickcheck@0.11.2
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:21 ("merge - concurrent edits (2 agents x 10)") ok
time (mean ± σ)         range (min … max) 
  21.58 µs ± 628.06 ns    21.04 µs …  23.01 µs  in 10 ×   4614 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:59 ("merge - concurrent edits (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
 110.38 µs ± 639.70 ns   109.48 µs … 111.47 µs  in 10 ×    912 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:97 ("merge - concurrent edits (2 agents x 200)") ok
time (mean ± σ)         range (min … max) 
 507.91 µs ±   3.18 µs   504.09 µs … 514.89 µs  in 10 ×    200 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:135 ("merge - many agents (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
 143.08 µs ± 316.01 ns   142.69 µs … 143.66 µs  in 10 ×    699 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:184 ("merge - with deletes (50 inserts, 25 deletes)") ok
time (mean ± σ)         range (min … max) 
 105.29 µs ±   1.15 µs   104.33 µs … 108.26 µs  in 10 ×    950 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:230 ("merge - graph_diff advance (20 ops)") ok
time (mean ± σ)         range (min … max) 
  68.74 µs ± 392.62 ns    68.12 µs …  69.40 µs  in 10 ×   1462 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:303 ("merge - repeated small (10 iterations x 5 ops)") ok
time (mean ± σ)         range (min … max) 
 108.27 µs ± 268.18 ns   107.85 µs … 108.58 µs  in 10 ×    927 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:341 ("merge - retreat concurrent deletes (500 items, 50 deletes)") ok
time (mean ± σ)         range (min … max) 
 210.12 µs ± 460.83 ns   209.34 µs … 210.68 µs  in 10 ×    476 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:408 ("merge - context apply operations (50 ops)") ok
time (mean ± σ)         range (min … max) 
  39.47 µs ±  18.88 µs    26.10 µs …  77.68 µs  in 10 ×   2348 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   4.00 µs ±  40.73 ns     3.93 µs …   4.07 µs  in 10 ×  24676 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  28.72 µs ± 264.02 ns    28.37 µs …  29.23 µs  in 10 ×   3475 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 372.55 µs ±   1.15 µs   370.86 µs … 374.38 µs  in 10 ×    267 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  11.82 µs ±   3.37 µs     9.18 µs …  18.88 µs  in 10 ×   7971 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  99.38 µs ±  54.07 µs    59.63 µs … 223.93 µs  in 10 ×   1119 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  37.05 µs ±  90.93 ns    36.93 µs …  37.17 µs  in 10 ×   2696 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  37.78 µs ± 205.31 ns    37.45 µs …  38.15 µs  in 10 ×   2656 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:176 ("branch - repeated advance steady-state (10 iterations)") ok
time (mean ± σ)         range (min … max) 
  27.35 µs ± 495.51 ns    26.97 µs …  28.32 µs  in 10 ×   3611 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:220 ("branch - repeated advance with oplog mutations (10 iterations)") ok
time (mean ± σ)         range (min … max) 
   7.06 ms ±   3.41 ms     2.83 ms …  12.79 ms  in 10 ×     64 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  12.09 µs ± 388.38 ns    11.80 µs …  12.98 µs  in 10 ×   8154 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 122.50 µs ± 424.25 ns   121.71 µs … 123.03 µs  in 10 ×    820 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:285 ("branch - single advance (1 new op)") ok
time (mean ± σ)         range (min … max) 
   4.16 µs ± 387.53 ns     3.89 µs …   5.04 µs  in 10 ×  23911 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  50.97 µs ±  30.06 µs    31.31 µs … 117.93 µs  in 10 ×   2170 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  16.55 ms ±   7.67 ms     6.73 ms …  31.07 ms  in 10 ×     28 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  19.35 µs ±   9.69 µs    12.37 µs …  37.52 µs  in 10 ×   7129 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 622.84 ns ±   7.05 ns   613.56 ns … 631.92 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:22 ("walker - linear history (100 ops)") ok
time (mean ± σ)         range (min … max) 
   4.79 µs ±   4.60 ns     4.78 µs …   4.80 µs  in 10 ×  20836 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  44.64 µs ± 719.72 ns    44.08 µs …  46.21 µs  in 10 ×   2260 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:54 ("walker - concurrent branches (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
   6.06 µs ±   9.96 ns     6.05 µs …   6.08 µs  in 10 ×  13680 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:79 ("walker - concurrent branches (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
   6.07 µs ±  13.31 ns     6.06 µs …   6.09 µs  in 10 ×  16261 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:99 ("walker - diamond pattern (50 diamonds)") ok
time (mean ± σ)         range (min … max) 
   8.19 µs ±  24.48 ns     8.16 µs …   8.23 µs  in 10 ×  12241 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:121 ("walker - diff advance only (10 new ops)") ok
time (mean ± σ)         range (min … max) 
   3.42 µs ±   5.32 ns     3.41 µs …   3.43 µs  in 10 ×  29157 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:145 ("walker - diff with concurrent branches") ok
time (mean ± σ)         range (min … max) 
   5.59 µs ± 134.90 ns     5.51 µs …   5.96 µs  in 10 ×  18076 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 464.22 µs ±   1.10 µs   462.75 µs … 466.54 µs  in 10 ×    215 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   7.87 ms ±  69.09 µs     7.76 ms …   7.95 ms  in 10 ×     13 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:213 ("walker - concurrent branches (100000 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
  26.76 ms ±   3.26 ms    24.01 ms …  33.36 ms  in 10 ×      4 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:6 ("version_vector - create (1 agent)") ok
time (mean ± σ)         range (min … max) 
  58.22 ns ±   0.26 ns    57.66 ns …  58.52 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:15 ("version_vector - create (5 agents)") ok
time (mean ± σ)         range (min … max) 
 274.85 ns ±   0.71 ns   273.82 ns … 275.82 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:29 ("version_vector - create (20 agents)") ok
time (mean ± σ)         range (min … max) 
   1.34 µs ±   3.09 ns     1.34 µs …   1.35 µs  in 10 ×  74489 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:42 ("version_vector - compare equal (5 agents)") ok
time (mean ± σ)         range (min … max) 
 332.28 ns ±   0.71 ns   331.10 ns … 333.31 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:63 ("version_vector - compare <= (5 agents)") ok
time (mean ± σ)         range (min … max) 
 165.82 ns ±   0.52 ns   165.39 ns … 166.84 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:84 ("version_vector - compare <= (20 agents)") ok
time (mean ± σ)         range (min … max) 
 687.54 ns ±   9.68 ns   681.87 ns … 714.08 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:100 ("version_vector - merge (5 agents)") ok
time (mean ± σ)         range (min … max) 
 467.50 ns ±   1.65 ns   465.74 ns … 470.81 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:118 ("version_vector - merge (20 agents)") ok
time (mean ± σ)         range (min … max) 
   2.62 µs ±   5.46 ns     2.61 µs …   2.63 µs  in 10 ×  38139 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:134 ("version_vector - includes (5 agents)") ok
time (mean ± σ)         range (min … max) 
 241.00 ns ±   0.97 ns   239.49 ns … 242.43 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:153 ("version_vector - concurrent (5 agents)") ok
time (mean ± σ)         range (min … max) 
 172.23 ns ±   0.53 ns   171.52 ns … 172.87 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:170 ("version_vector - from_frontier (10 ops)") ok
time (mean ± σ)         range (min … max) 
 553.38 ns ±   1.42 ns   551.41 ns … 556.72 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:186 ("version_vector - from_frontier (100 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.60 µs ±   8.98 ns     4.58 µs …   4.61 µs  in 10 ×  21791 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:206 ("version_vector - to_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
 267.82 ns ±   0.69 ns   266.91 ns … 268.80 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:230 ("version_vector - roundtrip (5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.94 µs ±   4.29 ns     4.94 µs …   4.95 µs  in 10 ×  20244 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:251 ("version_vector - agents (5 agents)") ok
time (mean ± σ)         range (min … max) 
  76.22 ns ±   0.74 ns    75.12 ns …  77.26 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:266 ("version_vector - length (20 agents)") ok
time (mean ± σ)         range (min … max) 
  12.93 ns ±   0.59 ns    12.33 ns …  13.87 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:20 ("bench: cache invalidate + position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 192.78 µs ± 798.23 ns   191.61 µs … 193.79 µs  in 10 ×    479 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:31 ("bench: cache invalidate + position query (5000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.91 ms ±  64.27 µs     2.82 ms …   3.03 ms  in 10 ×     35 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   9.20 ms ± 259.28 µs     8.76 ms …   9.60 ms  in 10 ×     11 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:57 ("bench: 10 remote inserts + queries (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
   3.75 ms ±  64.92 µs     3.64 ms …   3.84 ms  in 10 ×     25 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:84 ("bench: 10 remote inserts + queries (5000-char doc)") ok
time (mean ± σ)         range (min … max) 
  33.14 ms ± 822.76 µs    31.87 ms …  34.43 ms  in 10 ×      4 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:113 ("bench: warm cache position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 101.05 ns ±   0.39 ns   100.58 ns … 101.77 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:120 ("bench: warm cache position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
 100.78 ns ±   0.42 ns   100.24 ns … 101.50 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/fugue/tree_position_benchmark.mbt:20 ("bench: lv_to_position middle of 10K tree") ok
time (mean ± σ)         range (min … max) 
 564.31 µs ±   2.75 µs   559.70 µs … 567.81 µs  in 10 ×    179 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 164.83 µs ± 741.27 ns   163.94 µs … 166.26 µs  in 10 ×    612 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:26 ("jump - concurrent insert into 1K doc") ok
time (mean ± σ)         range (min … max) 
 159.50 µs ± 830.87 ns   158.50 µs … 161.09 µs  in 10 ×    629 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:58 ("jump - concurrent insert into 10K doc") ok
time (mean ± σ)         range (min … max) 
   4.49 ms ±  95.42 µs     4.36 ms …   4.68 ms  in 10 ×     23 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 159.34 µs ± 742.22 ns   158.35 µs … 160.31 µs  in 10 ×    631 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  41.89 µs ±   1.00 µs    41.28 µs …  44.63 µs  in 10 ×   2326 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 526.86 µs ±   2.22 µs   522.99 µs … 530.78 µs  in 10 ×    190 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:34 ("oplog - insert and delete mix (100 ops)") ok
time (mean ± σ)         range (min … max) 
  61.69 µs ± 319.38 ns    61.34 µs …  62.22 µs  in 10 ×   1615 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  31.05 µs ±  88.72 ns    30.89 µs …  31.15 µs  in 10 ×   3225 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 128.43 ns ±   0.34 ns   128.03 ns … 129.24 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:97 ("oplog - get_frontier (single agent)") ok
time (mean ± σ)         range (min … max) 
  30.62 ns ±   6.54 ns    22.80 ns …  40.75 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:112 ("oplog - get_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
  26.52 ns ±   0.30 ns    25.98 ns …  26.89 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:134 ("oplog - walk_and_collect (100 ops)") ok
time (mean ± σ)         range (min … max) 
   8.50 µs ±  55.22 ns     8.44 µs …   8.62 µs  in 10 ×  11591 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  17.25 µs ± 130.12 ns    17.09 µs …  17.48 µs  in 10 ×   5759 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:177 ("oplog - diff_and_collect (advance 20)") ok
time (mean ± σ)         range (min … max) 
   5.09 µs ±  13.36 ns     5.06 µs …   5.10 µs  in 10 ×  19400 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   7.43 µs ±  20.21 ns     7.40 µs …   7.45 µs  in 10 ×  14173 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 238.19 µs ± 739.52 ns   236.94 µs … 239.07 µs  in 10 ×    421 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  41.17 µs ± 111.43 ns    41.05 µs …  41.32 µs  in 10 ×   2416 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 171.85 ms ±  28.59 ms   129.81 ms … 200.04 ms  in 10 ×      1 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:287 ("oplog - diff_and_collect (100000 ops advance)") ok
time (mean ± σ)         range (min … max) 
  66.58 ms ±  18.06 ms    46.19 ms …  89.92 ms  in 10 ×      2 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:10 ("text - insert append (100 chars)") ok
time (mean ± σ)         range (min … max) 
 103.52 µs ± 326.06 ns   102.95 µs … 103.97 µs  in 10 ×    872 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.38 ms ±   7.79 µs     1.38 ms …   1.40 ms  in 10 ×     73 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 181.63 µs ± 953.63 ns   180.25 µs … 183.58 µs  in 10 ×    551 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:51 ("text - delete (100 deletes from 100-char doc)") ok
time (mean ± σ)         range (min … max) 
 253.86 µs ± 700.40 ns   253.10 µs … 254.90 µs  in 10 ×    393 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  14.73 µs ±  91.11 ns    14.62 µs …  14.83 µs  in 10 ×   6740 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 150.50 µs ± 276.27 ns   149.90 µs … 150.82 µs  in 10 ×    666 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  13.07 ns ±   0.38 ns    12.66 ns …  13.73 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:113 ("text - sync export_all (100 ops)") ok
time (mean ± σ)         range (min … max) 
 105.60 ns ±   0.30 ns   105.18 ns … 105.95 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:126 ("text - sync export_all (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 105.52 ns ±   2.27 ns   104.19 ns … 111.77 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:139 ("text - sync export_since (50-op delta, 1000-op base)") ok
time (mean ± σ)         range (min … max) 
  36.80 µs ± 195.02 ns    36.59 µs …  37.06 µs  in 10 ×   2418 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  51.69 µs ± 464.67 ns    50.90 µs …  52.33 µs  in 10 ×   1904 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 656.60 µs ±   5.64 µs   652.18 µs … 671.43 µs  in 10 ×    154 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:186 ("text - bidirectional sync (2 peers, 50 ops each)") ok
time (mean ± σ)         range (min … max) 
 109.25 µs ± 952.49 ns   108.05 µs … 110.48 µs  in 10 ×    922 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  13.14 µs ±  45.67 ns    13.09 µs …  13.23 µs  in 10 ×   7549 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 153.68 µs ± 282.26 ns   153.34 µs … 154.12 µs  in 10 ×    644 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:256 ("text - undo record_insert (100 ops, 1 group)") ok
time (mean ± σ)         range (min … max) 
   2.01 µs ±   6.36 ns     2.00 µs …   2.02 µs  in 10 ×  49809 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:269 ("text - undo record_insert (100 ops, 100 groups)") ok
time (mean ± σ)         range (min … max) 
   2.41 µs ±   8.61 ns     2.40 µs …   2.42 µs  in 10 ×  41586 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  31.00 µs ±  81.86 ns    30.86 µs …  31.12 µs  in 10 ×   3222 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 497.56 µs ±   2.01 µs   495.14 µs … 502.30 µs  in 10 ×    201 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:309 ("text - undo undo+redo roundtrip (10-op group)") ok
time (mean ± σ)         range (min … max) 
  34.36 µs ± 103.13 ns    34.23 µs …  34.57 µs  in 10 ×   2900 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:324 ("text - undo 10 undo+redo cycles (10-op group)") ok
time (mean ± σ)         range (min … max) 
 295.83 µs ±   1.29 µs   294.29 µs … 298.66 µs  in 10 ×    340 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.38 ms ±   7.84 µs     1.37 ms …   1.40 ms  in 10 ×     73 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.63 ms ±  28.40 µs     3.58 ms …   3.68 ms  in 10 ×     27 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.32 ms ±  15.61 µs     2.29 ms …   2.34 ms  in 10 ×     43 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:71 ("cache - jump to middle every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.01 ms ±  18.92 µs     2.98 ms …   3.05 ms  in 10 ×     34 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:94 ("cache - single non-seq insert on 1000-char doc") ok
time (mean ± σ)         range (min … max) 
   8.21 µs ±   1.26 µs     6.99 µs …  10.63 µs  in 10 ×  14028 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:108 ("cache - single non-seq insert on 5000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.49 µs ±   1.10 µs     6.57 µs …  10.38 µs  in 10 ×  14213 runs
Total tests: 105, passed: 105, failed: 0.

Benchmarks run with --release flag

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 35f58c88e2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +151 to +153
let target_decl = declaration_id_for_name_at_node(
g, flat_proj, source_map, target_node_id, v,
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Ignore the binding being removed during inline checks

When the initializer has a free occurrence with the same name as the binding being inlined, e.g. let x = x\nx, this lookup resolves target_decl to the current module declaration because the graph is built before the inline deletes that declaration. The source occurrence is correctly unresolved in its own initializer, so the comparison below reports a rebind and rejects the inline, even though after deleting the binding the inserted x would also be unresolved and semantics are preserved. Treat the module decl being inlined as absent when computing the target declaration.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ad9a487acb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +218 to +220
collect_var_usages(source_node, name, var_ids)
var_ids.any(fn(vid) {
@scope.declaration(g, vid).map(fn(d) { d.id }) != target_decl
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Ignore locally bound occurrences during rebind checks

When the initializer has both a free occurrence and a nested binder with the same name, this collects every Var(name) under source_node, including occurrences that free_vars excluded as locally bound. For example, in let y = 1 let x = y + (λy. y) x, inlining x should be safe because the free y still resolves to the module binding and the inner λy. y remains self-bound, but the inner y resolves to a different declaration than the target and makes this guard reject the edit. Filter the collected ids to only the free occurrences whose original declaration is the one being compared.

Useful? React with 👍 / 👎.

@dowdiness dowdiness merged commit c6c62d0 into main May 31, 2026
27 checks passed
@dowdiness dowdiness deleted the feat/lambda-enclosing-env branch May 31, 2026 10:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant